const fs = wx.getFileSystemManager()
const FILE_BASE_PATH = wx.env.USER_DATA_PATH + '/BASE64_SRC' // 图片存储路径
const MAX_FILE_NUM = 30 // 最多缓存文件数量

export default function base64src (base64data) {
    return new Promise((resolve, reject) => {
        initDirectory() // 图片文件夹 初始化
            .then(() => {
                // 删除本地文件
                deleteFiles()

                // 写入文件
                writeFiles(base64data, resolve, reject)
            })
            .catch(err => {
                console.warn('创建文件夹失败')
                console.error(err.errMsg)
                console.error(err)
                reject(err)
            })
    })
}

// 图片文件夹 初始化
function initDirectory () {
    return new Promise((resolve, reject) => {
        try {
            // 判断文件夹是否存在
            fs.accessSync(FILE_BASE_PATH)
            resolve()
        } catch (e) {
            // 文件夹不存在 - 创建文件夹
            try {
                fs.mkdirSync(FILE_BASE_PATH)
                resolve()
            } catch (err) {
                reject(err)
            }
        }
    })
}

// 删除本地文件
function deleteFiles () {
    try {
        // 读取文件列表
        const files = fs.readdirSync(FILE_BASE_PATH)
        const deleteNum = files.length - MAX_FILE_NUM // 待删除数量

        if (deleteNum > 0) {
            // 从 最早存储的文件 开始删除
            const deleteList = files.slice(0, deleteNum)
            deleteList.forEach(file => {
                try {
                    fs.unlinkSync(FILE_BASE_PATH + '/' + file)
                } catch (err) {
                    console.warn('删除文件失败')
                    console.error(err)
                }
            })
        }
    } catch (err) {
        console.warn('读取文件列表失败')
        console.error(err)
    }
}

// 写入文件
function writeFiles (base64data, resolve, reject) {
    const [, format, bodyData] = /data:image\/(\w+);base64,(.*)/.exec(base64data) || []

    if (!format) {
        reject(new Error('ERROR_BASE64SRC_PARSE'))
    }

    const filePath = `${FILE_BASE_PATH}/${getFileName()}.${format}`
    const buffer = wx.base64ToArrayBuffer(bodyData)

    fs.writeFile({
        filePath,
        data: buffer,
        encoding: 'binary',
        success () {
            resolve(filePath)
        },
        fail (err) {
            console.warn(err.errMsg)
            reject(new Error('ERROR_BASE64SRC_WRITE'))
        }
    })
}

// 生成文件名
function getFileName () {
    return new Date().getTime() + Math.ceil(Math.random() * 1e+5)
}
